// 使用BepuUtilities;
// 使用BepuUtility：Memory;
// 使用BepuPhysics.Constraints;
// 使用制度;
// 使用System.Collections.Generic;
// 使用System.Diagnostics;
// 使用System.Text;
// 使用System.Threading;

// 命名空间BepuPhysical
// {
// 公共分部类求解器
// {

// InMANUALNAVEBLOCKING索引;
// InmanualNaveExclusiveEndIndex;
// void ManualNavePrestep(Int WorkerIndex)
// {
// int block Index;
// ref var activeSet=ref ActiveSet;
// var inverseDt=1f/context.Dt;
// WHILE((BLOCKINDEX=Interlocked.Increment(REF ManualNaveBlockIndex))<=manualNaveExclusiveEndIndex)
// {
// 块索引-=1;
// ref var挡路=ref context.ConstraintBlocks.Blocks[块索引];
// 参考变量类型批次=参考activeSet.Batches[block.BatchIndex].TypeBatches[block.TypeBatchIndex];
// IF(block.BatchIndex<FallbackBatchThreshold)
// TypeProcessors[typeBatch.TypeId].Prestep(Ref typeBatch,Body,context.Dt,inverseDt,block.StartBundle,block.End);
// 其他
// TypeProcessors[typeBatch.TypeId].JacobiPrestep(ref类型Batch,Body,Ref ActiveSet.Fallback,context.Dt,inverseDt,block.StartBundle,block.End);
// }
// }
// void ManualNaveWarmStart(Int WorkBlockIndex)
// {
// int block Index;
// ref var activeSet=ref ActiveSet;
// WHILE((BLOCKINDEX=Interlocked.Increment(REF ManualNaveBlockIndex))<=manualNaveExclusiveEndIndex)
// {
// ref var挡路=ref context.ConstraintBlocks.Blocks[块索引-1];
// 参考变量类型批次=参考activeSet.Batches[block.BatchIndex].TypeBatches[block.TypeBatchIndex];
// IF(block.BatchIndex<FallbackBatchThreshold)
// {
// TypeProcessors[typeBatch.TypeId].JacobiWarmStart(ref类型Batch,Ref Bodies.ActiveSet.Veloities,Ref context.FallbackResults[block.TypeBatchIndex],BLOCK.StartBundle,BLOCK.End);
// }
// 其他
// {
// TypeProcessors[typeBatch.TypeId].WarmStart(ref类型Batch,Ref Bodies.ActiveSet.Veloities,block.StartBundle,block.End);
// }
// }
// }

// void ManualNaveSolveIteration(Int WorkBlockIndex)
// {
// int block Index;
// ref var activeSet=ref ActiveSet;
// WHILE((BLOCKINDEX=Interlocked.Increment(REF ManualNaveBlockIndex))<=manualNaveExclusiveEndIndex)
// {
// ref var挡路=ref context.ConstraintBlocks.Blocks[块索引-1];
// 参考变量类型批次=参考activeSet.Batches[block.BatchIndex].TypeBatches[block.TypeBatchIndex];
// IF(block.BatchIndex<FallbackBatchThreshold)
// {
// TypeProcessors[typeBatch.TypeId].SolveIteration(ref类型Batch,Ref Bodies.ActiveSet.Veloities,block.StartBundle,block.End);
// }
// 其他
// {
// TypeProcessors[typeBatch.TypeId].JacobiSolveIteration(ref类型Batch,Ref Bodies.ActiveSet.Veloities,Ref context.FallbackResults[block.TypeBatchIndex],BLOCK.StartBundle,BLOCK.End);
// }
// }
// }




// public void ManualNaiveMultithreadedUpdate(IThreadDispatcher线程池,BufferPool BufferPool,Float Dt,Float InverseDt)
// {
// var workerCount=context.WorkerCount=threadPool.ThreadCount;
// context.dt=dt;
// //首先构建一组工作块。
// //挡路的大小应该比较小,让偷工者有事可做,但是我们也不想因为块数太多而发疯。
// //这些值是通过经验调整得出的。最佳值可能因体系结构而异。
// const int target BlocksPerBatchPerWorker=4;
// const int Minimum BlockSizeInBunles=4;
// //请注意,在3770K上,最昂贵的约束包执行迭代的成本往往低于500 ns。挡路的最小大小
// //正在尝试平衡具有无意义的块数量和最坏情况下的工作空闲长度。例如,挡路大小为8,
// //假设每个包500 ns,我们冒着每次迭代高达4微秒的风险-相当于空闲时间的批次。
// //这个问题并不是我们使用的有点奇怪的窃取工作方案所独有的-不管怎样,它仍然会是一个令人担忧的问题。
// var maxumBlocksPerBatch=workerCount*targetBlocksPerBatchPerWorker;
// var过滤=new MainSolveFilter();
// 构建工作块(BufferPool,最小值BlockSizeInBunles,最大值BlocksPerBatch,参考过滤);
// 验证工作块(参考过滤);

// manualNaveBlockIndex=0;
// manualNaveExclusiveEndIndex=context.ConstraintBlocks.Blocks.Count;
// threadPool.DispatchWorkers(ManualNaivePrestep);

// ref var activeSet=ref ActiveSet;
// for(int batchIndex=0;batchIndex<activeSet.Batches.Count;++batchIndex)
// {
// manualNaveBlockIndex=batchIndex>0？context.BatchBoraries[batchIndex-1]：0;
// manualNaveExclusiveEndIndex=context.BatchBoraries[batchIndex];
// threadPool.DispatchWorkers(ManualNaiveWarmStart);
// }

// for(int iterationIndex=0;iterationIndex<iterationCount;++iterationIndex)
// {
// for(int batchIndex=0;batchIndex<activeSet.Batches.Count;++batchIndex)
// {
// manualNaveBlockIndex=batchIndex>0？context.BatchBoraries[batchIndex-1]：0;
// manualNaveExclusiveEndIndex=context.BatchBoraries[batchIndex];
// threadPool.DispatchWorkers(ManualNaiveSolveIteration);
// }
// }


// context.ConstraintBlocks.Blocks.Dispose(bufferPool);
// BufferPool.Return(参考上下文.BatchBoraries);
// }

// }
// }
